package com.ruoyi.system.domain;

import com.ruoyi.common.domain.BaseEntity;
import org.babyfish.jimmer.Formula;
import org.babyfish.jimmer.sql.*;
import org.springframework.lang.Nullable;

import java.util.Date;
import java.util.List;

import static com.ruoyi.common.core.constant.ServiceNameConstants.SYSTEM_SERVICE;

/**
 * 用户对象 sys_user
 *
 * @author ruoyi
 */
@Entity(microServiceName = SYSTEM_SERVICE)
@Table(name = "sys_user")
public interface SysUser extends BaseEntity {

    /**
     * 用户ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    long userId();

    /**
     * 部门ID
     */
    @IdView
    long deptId();

    /**
     * 用户账号
     */
    String userName();

    /**
     * 用户昵称
     */
    String nickName();

    /**
     * 用户邮箱
     */
    @Nullable
    String email();

    /**
     * 手机号码
     */
    @Nullable
    String phonenumber();

    /**
     * 用户性别
     */
    @Nullable
    String sex();

    /**
     * 用户头像
     */
    @Nullable
    String avatar();

    /**
     * 密码
     */
    String password();

    /**
     * 账号状态（0正常 1停用）
     */
    String status();

    /**
     * 删除标志（0代表存在 2代表删除）
     */
    @Default("0")
    @LogicalDeleted("2")
    int delFlag();

    /**
     * 最后登录IP
     */
    @Nullable
    String loginIp();

    /**
     * 最后登录时间
     */
    @Nullable
    Date loginDate();

    /**
     * 密码最后更新时间
     */
    @Nullable
    Date pwdUpdateDate();

    /**
     * 部门对象
     */
    @ManyToOne
    @OnDissociate(DissociateAction.DELETE)
    SysDept dept();

    /**
     * 角色对象
     */
    @ManyToMany
    @JoinTable(
            name = "sys_user_role",
            joinColumnName = "user_id",
            inverseJoinColumnName = "role_id"
    )
    List<SysRole> roles();

    /**
     * 角色组
     */
    @IdView("roles")
    List<Long> roleIds();

    /**
     * 岗位组
     */
    @IdView("posts")
    List<Long> postIds();

    @ManyToMany
    @JoinTable(
            name = "sys_user_post",
            joinColumnName = "user_id",
            inverseJoinColumnName = "post_id"
    )
    List<SysPost> posts();

    /**
     * 创建者
     */
    @Nullable
    @ManyToOne
    @OnDissociate(DissociateAction.SET_NULL)
    @JoinColumn(name = "create_by")
    SysUser createBy();

    /**
     * 更新者
     */
    @Nullable
    @ManyToOne
    @OnDissociate(DissociateAction.SET_NULL)
    @JoinColumn(name = "update_by")
    SysUser updateBy();

    @Formula(dependencies = {"userId"})
    default boolean isAdmin() {
        return userId() == 1L;
    }
}
